<?php defined('SYSPATH') OR die('No direct access allowed.');

require_once Kohana::find_file('libraries', 'commonConstant');

/**
 * テンプレート取得クラス
 *
 * @author Lty-Chiba
 * @since 2010/11/24
 * @version 1.0
 */
class TemplateStore {

	/** ベーステンプレートの置換用文字列 */
	const HEADER_AREA = '@HEADER_AREA';
	const MAIN_AREA = '@MAIN_AREA';
	const FOOTER_AREA = '@FOOTER_AREA';

	/** コンストラクタ */
	private function __construct() {
		self::load();
	}

	/** インスタンス */
	private static $TEMPLATE_STORE_INSTANCE;

	/**
	 * インスタンス生成処理
	 *
	 * 初回のみインスタンス生成する
	 *
	 * @return $TEMPLATE_STORE_INSTANCE:唯一インスタンス
	 */
	public static function getInstance() {
		if (!isset(self::$TEMPLATE_STORE_INSTANCE)) {
			self::$TEMPLATE_STORE_INSTANCE = new self;
		}
		return self::$TEMPLATE_STORE_INSTANCE;
	}

	/** テンプレート格納配列 */
	private static $TEMPS = array(array());

	/** 共通テンプレート名格納配列 */
	private static $COMMON_TEMPS = array(C_BASE_TEMPLATE, C_HEADER_TEMPLATE, C_FOOTER_TEMPLATE);

	/**
	 * 画面毎のテンプレート名格納配列
	 *
	 * 例)
	 * array[0][0]：テンプレート名
	 * array[0][1]：ヘッダ＆フッタ表示フラグ
	 *              Trueは表示し、Falseは非表示
	 */
	private static $VIEW_TEMPS = array(
										array(C_LOGIN_TEMPLATE, false),
										array(C_MAIN_TEMPLATE, true),
										array(C_USER_LIST, true),
										array(C_USER_DETAIL, true)
								);

	/**
	 * テンプレートファイル読み込み処理
	 *
	 * 初回インスタンス生成時に行われる
	 */
	private static final function load() {
		// 共通テンプレート取得
		$comTemps = array();
		for($i=0; $i<count(self::$COMMON_TEMPS); $i++) {
			$comTemps[$i] = file_get_contents(Kohana::find_file('views' ,self::$COMMON_TEMPS[$i], false, 'html'));
		}

		// 画面毎のテンプレート取得
		foreach(self::$VIEW_TEMPS as $viewTemp) {
			$temp = file_get_contents(Kohana::find_file('views' ,$viewTemp[0], false, 'html'));

			// ヘッダ・フッタの表示を判定
			if($viewTemp[1]) {
				self::$TEMPS[$viewTemp[0]] = self::replaceTemplate($comTemps[0], $comTemps[1], $temp, $comTemps[2]);

			} else {
				self::$TEMPS[$viewTemp[0]] = self::replaceTemplate($comTemps[0], '', $temp, '');
			}
		}
	}

	/**
	 * テンプレートの置換処理
	 *
	 * 共通テンプレートのヘッダ部、メイン部、フッタ部を置換する
	 *
	 * @param $base：ベーステンプレート
	 * @param $header：ヘッダ部テンプレート
	 * @param $main：メイン部テンプレート
	 * @param $footer；フッタ部テンプレート
	 *
	 * @return $result：置換後のテンプレート
	 */
	private static final function replaceTemplate($base, $header, $main, $footer) {
		$result = str_replace(self::HEADER_AREA, $header, $base);
		$result = str_replace(self::MAIN_AREA, $main, $result);
		$result = str_replace(self::FOOTER_AREA, $footer, $result);

		return $result;
	}

	/**
	 * テンプレート取得処理
	 *
	 * テンプレート名と一致するテンプレートを取得
	 * 存在しない場合、exceptionを投げる
	 *
	 * @param $templateName:テンプレート名
	 * @return self::$TEMPS[$templateName];テンプレート(文字列)
	 */
	public function getTemplate($templateName) {
		if(!isset(self::$TEMPS[$templateName])) {
			// TODO Lty-Chiba
			// ログ出力
			throw new Exception('んなもんねーよ');
		}
		return self::$TEMPS[$templateName];
	}
}